/*--------------------------------------------------------------
 * File: devPublic.h 编码类型：C语言  UTF-8
 * Author WRS (1352509846@qq.com)
 * 功能: 模拟设备用的大公共信息
 * Version 0.1
 * Date 2024-11-06 
 * 
 * @copyright Copyright (c) 2024
 * 
----------------------------------------------------------------*/
#ifndef __DEVPUBLIC_H
#define	__DEVPUBLIC_H

#ifdef __cplusplus
extern "C" {
#endif
#include "stdio.h"
#include "stdint.h"
#include "esp_err.h"

typedef enum
{
    Info_noSave = 111,
    Info_Save = 222,
} DevSave_t;

typedef enum
{
    simTypeB = 0,
    simTypeMD8 = 1,  //
    simTypeMA8 = 2,  //
    simTypeM38 = 3,  // BM38
    simTypeM26 = 4,  // BM26
    simTypeM42 = 5,  // BM42
    simTypeML4 = 6,  //
    simTypeML12 = 7, //
    
    // Add more device types as needed
} Dev_type_t;

typedef enum
{
    WIFI_MODBUS_TCP = 1,
    WIFI_MQTT,
    Lynkros_55FF,
    // Add more link types as needed
} Dev_link_type_t;

typedef enum
{
    Dev_stop = 0,
    Dev_start,
} Dev_status_t;

// 设备类型信息结构
typedef struct
{
    Dev_type_t Dev_SCRx_type;    // 设备类型 最多255中设备类型（1~~255）
    Dev_status_t Dev_status;// 设备状态
    Dev_link_type_t Dev_link_type;  // 设备通信类型（0 wifi 1串口 ....）
    // uint8_t Dev_protocol;   // 设备协议类型（1 modbusTCP 2 55FF 3 MQTT 4 modbusRTU ....）
    uint8_t Dev_num;                 // 模拟设备的个数（一个硬件设备可以模拟成功多个指定的设备，比如模拟10个温湿度设备）
    void (*Dev_init)(void );    // 指向带有指针参数的设备初始化函数的函数指针
    void (*Dev_start)(void );   // 指向带有指针参数的数据处理函数的函数指针
    void (*Dev_stop)(void );    // 指向带有指针参数的数据处理函数的函数指针
    void (*Func_ReceiveVar)(uint32_t, uint8_t*, void*);
    uint32_t  (*Func_ReceiveVarReturn)(uint32_t, uint8_t*, void*, uint8_t*);
} Dev_t;
extern Dev_t Dev_info;

typedef struct
{
    uint8_t devBML04_num;   // BML04设备的个数
    uint8_t devBML12_num;   // BML12设备的个数
    uint8_t devMA8_num;     // MA8设备的个数
    uint8_t devMD8_num;     // MD8设备的个数
    uint8_t devM38_num;     // M38设备的个数
    uint8_t devM26_num;     // M26设备的个数

}__attribute__((packed)) Dev_num_t;

typedef enum
{
    Bit_RESET = 0,
    Bit_SET
} BitAction;

typedef enum
{
    emRandom_0 = 0, // 必须从0开始，这里和LVGL的下来框里的选项所以对应，顺序也不能随便改变
    emRandom_2,
    emRandom_10,
    emRandom_0_10,
    emRandom_2_10,
    emRandom_Linear,
    emRandom_sin,
    emRandom_cos,
    emRandom_SD
}Random_em;

typedef enum
{
    devStart = 0,           // 系统启动
    devReqAddr = 0x100,     // 申请地址
    devRun = 0x1000,        // 运行
}Dev_state_t;

void dev_Public_Init(void);

void VARTable_RecVar_W(uint32_t ctrl, uint8_t *pValue, void *pVarDes);
uint32_t VARTable_RecVar_R(uint32_t ctrl, uint8_t *pValue, void *pVarDes, uint8_t *devaddr);


#ifdef __cplusplus
}
#endif


#endif
